/*
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * Copyright 2002-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 * $Id: XPathNamespaceImpl.java,v 1.2.4.1 2005/09/10 04:10:02 jeffsuttor Exp $
 */


package com.sun.org.apache.xpath.internal.domapi;

import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.xpath.XPathNamespace;

import org.w3c.dom.UserDataHandler;

/**
 * The <code>XPathNamespace</code> interface is returned by <code>XPathResult</code> interfaces to
 * represent the XPath namespace node type that DOM lacks. There is no public constructor for this
 * node type. Attempts to place it into a hierarchy or a NamedNodeMap result in a
 * <code>DOMException</code> with the code <code>HIERARCHY_REQUEST_ERR</code> . This node is read
 * only, so methods or setting of attributes that would mutate the node result in a DOMException
 * with the code <code>NO_MODIFICATION_ALLOWED_ERR</code>. <p>The core specification describes
 * attributes of the <code>Node</code> interface that are different for different node node types
 * but does not describe <code>XPATH_NAMESPACE_NODE</code>, so here is a description of those
 * attributes for this node type. All attributes of <code>Node</code> not described in this section
 * have a <code>null</code> or <code>false</code> value. <p><code>ownerDocument</code> matches the
 * <code>ownerDocument</code> of the <code>ownerElement</code> even if the element is later adopted.
 * <p><code>prefix</code> is the prefix of the namespace represented by the node.
 * <p><code>nodeName</code> is the same as <code>prefix</code>. <p><code>nodeType</code> is equal to
 * <code>XPATH_NAMESPACE_NODE</code>. <p><code>namespaceURI</code> is the namespace URI of the
 * namespace represented by the node. <p><code>adoptNode</code>, <code>cloneNode</code>, and
 * <code>importNode</code> fail on this node type by raising a <code>DOMException</code> with the
 * code <code>NOT_SUPPORTED_ERR</code>.In future versions of the XPath specification, the definition
 * of a namespace node may be changed incomatibly, in which case incompatible changes to field
 * values may be required to implement versions beyond XPath 1.0. <p>See also the <a
 * href='http://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226'>Document Object Model (DOM)
 * Level 3 XPath Specification</a>.
 *
 * This implementation wraps the DOM attribute node that contained the namespace declaration.
 *
 * @xsl.usage internal
 */

class XPathNamespaceImpl implements XPathNamespace {

  // Node that XPathNamespaceImpl wraps
  final private Node m_attributeNode;

  /**
   * Constructor for XPathNamespaceImpl.
   */
  XPathNamespaceImpl(Node node) {
    m_attributeNode = node;
  }

  /**
   * @see com.sun.org.apache.xalan.internal.dom3.xpath.XPathNamespace#getOwnerElement()
   */
  public Element getOwnerElement() {
    return ((Attr) m_attributeNode).getOwnerElement();
  }

  /**
   * @see org.w3c.dom.Node#getNodeName()
   */
  public String getNodeName() {
    return "#namespace";
  }

  /**
   * @see org.w3c.dom.Node#getNodeValue()
   */
  public String getNodeValue() throws DOMException {
    return m_attributeNode.getNodeValue();
  }

  /**
   * @see org.w3c.dom.Node#setNodeValue(String)
   */
  public void setNodeValue(String arg0) throws DOMException {
  }

  /**
   * @see org.w3c.dom.Node#getNodeType()
   */
  public short getNodeType() {
    return XPathNamespace.XPATH_NAMESPACE_NODE;
  }

  /**
   * @see org.w3c.dom.Node#getParentNode()
   */
  public Node getParentNode() {
    return m_attributeNode.getParentNode();
  }

  /**
   * @see org.w3c.dom.Node#getChildNodes()
   */
  public NodeList getChildNodes() {
    return m_attributeNode.getChildNodes();
  }

  /**
   * @see org.w3c.dom.Node#getFirstChild()
   */
  public Node getFirstChild() {
    return m_attributeNode.getFirstChild();
  }

  /**
   * @see org.w3c.dom.Node#getLastChild()
   */
  public Node getLastChild() {
    return m_attributeNode.getLastChild();
  }

  /**
   * @see org.w3c.dom.Node#getPreviousSibling()
   */
  public Node getPreviousSibling() {
    return m_attributeNode.getPreviousSibling();
  }

  /**
   * @see org.w3c.dom.Node#getNextSibling()
   */
  public Node getNextSibling() {
    return m_attributeNode.getNextSibling();
  }

  /**
   * @see org.w3c.dom.Node#getAttributes()
   */
  public NamedNodeMap getAttributes() {
    return m_attributeNode.getAttributes();
  }

  /**
   * @see org.w3c.dom.Node#getOwnerDocument()
   */
  public Document getOwnerDocument() {
    return m_attributeNode.getOwnerDocument();
  }

  /**
   * @see org.w3c.dom.Node#insertBefore(Node, Node)
   */
  public Node insertBefore(Node arg0, Node arg1) throws DOMException {
    return null;
  }

  /**
   * @see org.w3c.dom.Node#replaceChild(Node, Node)
   */
  public Node replaceChild(Node arg0, Node arg1) throws DOMException {
    return null;
  }

  /**
   * @see org.w3c.dom.Node#removeChild(Node)
   */
  public Node removeChild(Node arg0) throws DOMException {
    return null;
  }

  /**
   * @see org.w3c.dom.Node#appendChild(Node)
   */
  public Node appendChild(Node arg0) throws DOMException {
    return null;
  }

  /**
   * @see org.w3c.dom.Node#hasChildNodes()
   */
  public boolean hasChildNodes() {
    return false;
  }

  /**
   * @see org.w3c.dom.Node#cloneNode(boolean)
   */
  public Node cloneNode(boolean arg0) {
    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null);
  }

  /**
   * @see org.w3c.dom.Node#normalize()
   */
  public void normalize() {
    m_attributeNode.normalize();
  }

  /**
   * @see org.w3c.dom.Node#isSupported(String, String)
   */
  public boolean isSupported(String arg0, String arg1) {
    return m_attributeNode.isSupported(arg0, arg1);
  }

  /**
   * @see org.w3c.dom.Node#getNamespaceURI()
   */
  public String getNamespaceURI() {

    // For namespace node, the namespaceURI is the namespace URI
    // of the namespace represented by the node.
    return m_attributeNode.getNodeValue();
  }

  /**
   * @see org.w3c.dom.Node#getPrefix()
   */
  public String getPrefix() {
    return m_attributeNode.getPrefix();
  }

  /**
   * @see org.w3c.dom.Node#setPrefix(String)
   */
  public void setPrefix(String arg0) throws DOMException {
  }

  /**
   * @see org.w3c.dom.Node#getLocalName()
   */
  public String getLocalName() {

    // For namespace node, the local name is the same as the prefix
    return m_attributeNode.getPrefix();
  }

  /**
   * @see org.w3c.dom.Node#hasAttributes()
   */
  public boolean hasAttributes() {
    return m_attributeNode.hasAttributes();
  }

  public String getBaseURI() {
    return null;
  }

  public short compareDocumentPosition(Node other) throws DOMException {
    return 0;
  }

  private String textContent;

  public String getTextContent() throws DOMException {
    return textContent;
  }

  public void setTextContent(String textContent) throws DOMException {
    this.textContent = textContent;
  }

  public boolean isSameNode(Node other) {
    return false;
  }

  public String lookupPrefix(String namespaceURI) {
    return ""; //PENDING
  }

  public boolean isDefaultNamespace(String namespaceURI) {
    return false;
  }

  public String lookupNamespaceURI(String prefix) {
    return null;
  }

  public boolean isEqualNode(Node arg) {
    return false;
  }

  public Object getFeature(String feature, String version) {
    return null; //PENDING
  }

  public Object setUserData(String key,
      Object data,
      UserDataHandler handler) {
    return null; //PENDING
  }

  public Object getUserData(String key) {
    return null;
  }
}
